package com.koi.system.service.role;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.koi.common.ex.koi.YUtil;
import com.koi.model.bo.element.SelectLongBo;
import com.koi.model.bo.element.TransferLongBo;
import com.koi.model.vo.system.SysRoleVo;
import com.koi.plus.mapper.system.SysRoleMapper;
import com.koi.pojo.system.SysRole;
import com.koi.pojo.system.SysUserRole;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author ･ᴗ･
 * @description [角色信息表-服务实现层]
 * 注意：用户配置一个部门，用户可以看当前部门的数据
 * 注意：角色配置多个部门，一个角色可以看多个部门的数据，然后根据用户ID查询角色，再查询部门进行权限判断，再使用AOP封装成注解
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {

    private final SysRoleMapper sysRoleMapper;

    /**
     * @description [多条件分页查询]
     * @author ･ᴗ･
     */
    @Override
    public IPage<SysRole> listPage(SysRoleVo vo) {
        // 分页构造器
        Page<SysRole> page = new Page<>(vo.getPageNo(), vo.getPageSize());
        // 进行分页查询
        page = sysRoleMapper.listPage(page, vo);
        return page;
    }

    /**
     * @description [查询是否拥有超级管理员角色-AOP]
     * @author ･ᴗ･
     */
    @Override
    public boolean getIsKoiAdmin(Long userId) {
        List<SysUserRole> userRoleList = sysRoleMapper.listSysUserRole(userId);
        YUtil.isTrue(ObjectUtils.isEmpty(userRoleList), "该用户未分配角色，禁止登录");
        return userRoleList.parallelStream().anyMatch(userRole -> userRole.getRoleId().equals(1L));
    }

    /**
     * @description [查询所有正常角色]
     * @author ･ᴗ･
     */
    @Override
    public List<TransferLongBo> listLeftRole() {
        return sysRoleMapper.listLeftRole();
    }

    /**
     * @description [查询当前用户拥有角色-穿梭框右侧]
     * @author ･ᴗ･
     */
    @Override
    public List<Long> listRightRole(Long userId) {
        return sysRoleMapper.listRightRole(userId);
    }

    /**
     * @description [删除当前用户拥有的角色]
     * @author ･ᴗ･
     */
    @Override
    public boolean deleteUserRole(Long userId) {
        return sysRoleMapper.deleteUserRole(userId);
    }

    /**
     * @description [根据用户ID分配角色-穿梭框]
     * @author ･ᴗ･
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void assignUserRole(Long userId, List<Long> roleIds) {
        // 1、删除当前用户拥有的角色
        this.deleteUserRole(userId);
        if (CollectionUtil.isNotEmpty(roleIds) && !roleIds.get(0).equals(-1L)) {
            // 2、添加当前用户选中的角色
            boolean batchAdd = sysRoleMapper.batchAddUserRole(userId, roleIds);
            YUtil.isTrue(!batchAdd, "分配角色失败，请重试");
        }
    }

    /**
     * @description [获取角色下拉框]
     * @author ･ᴗ･
     */
    @Override
    public List<SelectLongBo> listRoleElSelect() {
        return sysRoleMapper.listRoleElSelect();
    }

}
